//
// ----------------------------------------------------------------------------
// 文件： ArrayList1.h
// 日期： 2015年12月05日
// 功能： C版本动态数据访问库头文件
// 版本： v2.0
// 作者： 谈新
// 邮件： tanxin@smg.cn
// ----------------------------------------------------------------------------
//

#ifndef _ARRAYLIST1_H_
#define _ARRAYLIST1_H_

#include <netinet/in.h>

typedef struct _ITEMDATA
{
    int             fd;                 // 客户端socket
    char            name[300];          // 客户端名称
    char            appname[128];       // 客户端应用名称
    char            channel[128];       // 客户端应用频率
    char            program[128];       // 客户端应用栏目
    int             type;               // 客户端类型       0：Display  1：Control  2:Other
    int             iswebsocket;        // 连接协议类型     0：Tcp  1：Websocket
    int             logined;            // 客户端登陆状态
    char            ip[20];             // 客户端IP地址
    unsigned short  port;               // 客户端port端口
    double          activetime;         // 客户端激活时间
}   ITEMDATA;

typedef struct _ARRAYLIST
{
    #if defined(LINUX)
    pthread_mutex_t hMutex;                                                  // 列表访问锁
    #else 
    HANDLE          hMutex;
    #endif
    ITEMDATA        *data;                                                   // 列表的数据内容
    size_t          num;                                                     // 列表的元素计数器
    size_t          maxnum;                                                  // 列表的元素最大值
}   ARRAYLIST; 

int  ArrayListInit(ARRAYLIST *lst,unsigned int max);                         // 构造一个空列表
void ArrayListDestroy(ARRAYLIST *lst);                                       // 销毁列表
void ArrayListClear(ARRAYLIST *lst);                                         // 清为空列表
int  ArrayListIsEmpty(ARRAYLIST *lst);                                       // 若列表为空列表,则返回1,否则返回0 
int  ArrayListLength(ARRAYLIST *lst);                                        // 返回列表的长度 
int  ArrayListInsert(ARRAYLIST *lst,int fd,int isweb,char *appname,char *ip,unsigned short port);    // 插入列表 
int  ArrayListDelete(ARRAYLIST *lst,ITEMDATA *dat);                          // 删除列表记录 
int  ArrayListDeleteByFD(ARRAYLIST *lst,int fd);                             // 删除列表记录 
int  ArrayListUpdateActive(ARRAYLIST *lst,int fd);                           // 更新记录活动时间
int  ArrayListUpdateLogin(ARRAYLIST *lst,int fd,char *name,int type,char *channel,char *program,int overwrite,int conflict);        // 更新记录登陆状态
int  ArrayListDisplay(ARRAYLIST *lst,void (*func)(ARRAYLIST *l));            // 显示列表

char *GetAllDisplayName(ARRAYLIST *lst,char *str);     // 获取列表中所有显示大屏的名字列表
int  NameToFd(ARRAYLIST *lst,char *name);              // 通过名字在列表中查询设备号
void SendMessageToControl(ARRAYLIST *lst,char *str);   // 给列表中所有控制端发送显示大屏信息
int  isHotlineClientOn(ARRAYLIST *lst);                // 是否有热线电话的客户端在线
void SendPingToAll(ARRAYLIST *lst);
void ForwardCommand(ARRAYLIST *lst,int fd,int forward,char *name,char *channel,char *program,char *msg);           //

int  ArrayListUpdateByInt(ARRAYLIST *lst,int id,ITEMDATA *dat,int (*func)(ARRAYLIST *l,int i,ITEMDATA *d)); // 更新列表 
int  ArrayListFindByInt(ARRAYLIST *lst,int id,ITEMDATA *dat,int (*func)(ARRAYLIST *l,int i,ITEMDATA *d)); // 查找列表 
int  ArrayListFind(ARRAYLIST *lst,int n,ITEMDATA *dat);                      // 查找列表 
int  ArrayListCallback(ARRAYLIST *lst,int (*func)(ARRAYLIST *l));            // 列表功能回调函数

#endif

